package com.example.lib5.RecursionTest;

public class Maze {
    public static void main(String[] args) {
        //创建一个地图
        int[][] map = new int[8][7];
        //设置头、尾行为1,（墙壁）
        for (int i = 0; i < 7; i++) {
            map[0][i]=1;
            map[7][i]=1;
        }
        //设置头、尾列为1,（墙壁）
        for (int i = 0; i < 8; i++) {
            map[i][0]=1;
            map[i][6]=1;
        }
        //两个格子为1
        map[3][1]=1;
        map[3][2]=1;

        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 7; j++) {
                System.out.print(map[i][j]+"  ");
            }
            System.out.println();
        }

        //找路径
        setWay2(map,1,1);
        System.out.println("找路的结果：");
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 7; j++) {
                System.out.print(map[i][j]+"  ");
            }
            System.out.println();
        }

    }

    /**
     * 我们规定0表示没有走过的点，1表示墙壁，2表示走过的路的点，3表示死路走不通。map[5][6]=2表示成功
     * 走路的规律为下，右，上，左
     * @param map 传进来的迷宫，1表示墙壁
     * @param i 表示迷宫起始点的x坐标
     * @param j 表示迷宫起始点的Y坐标
     * @return true表示路径可行，false表示路径不可行
     */
    private static boolean setWay(int[][] map, int i, int j) {
        //走成功
        if (map[6][5]==2) {
            return true;
        }else {//表示没有走成功
            //先判断这个点是否可以走的，0表示可以走
            if (map[i][j]==0) {
                //没有的话继续走
                //设置一个可行的初始值
                map[i][j]=2;
                //向下走
                if (setWay(map,i+1,j)) {
                    return true;
                } else if (setWay(map,i,j+1)){//向右走
                    return true;
                }else if (setWay(map,i-1,j)){//向上走
                    return true;
                }else if (setWay(map, i, j-1)){//向左走
                    return true;
                }else {
                    map[i][j]=3;
                    return false;
                }
            }else {
                //可能是1墙壁，2走过了，不可以回头走，3表示死路
                return false;
            }
        }

    }
    /**
     * 我们规定0表示没有走过的点，1表示墙壁，2表示走过的路的点，3表示死路走不通。map[5][6]=2表示成功
     * 走路的规律为上，右，下，左
     * @param map 传进来的迷宫，1表示墙壁
     * @param i 表示迷宫起始点的x坐标
     * @param j 表示迷宫起始点的Y坐标
     * @return true表示路径可行，false表示路径不可行
     */
    private static boolean setWay2(int[][] map, int i, int j) {
        //走成功
        if (map[6][5]==2) {
            return true;
        }else {//表示没有走成功
            //先判断这个点是否可以走的，0表示可以走
            if (map[i][j]==0) {
                //没有的话继续走
                //设置一个可行的初始值
                map[i][j]=2;
                //向上走
                if (setWay2(map,i-1,j)) {
                    return true;
                } else if (setWay2(map,i,j+1)){//向右走
                    return true;
                }else if (setWay2(map,i+1,j)){//向下走
                    return true;
                }else if (setWay2(map, i, j-1)){//向左走
                    return true;
                }else {
                    map[i][j]=3;
                    return false;
                }
            }else {
                //可能是1墙壁，2走过了，不可以回头走，3表示死路
                return false;
            }
        }

    }
}
